package com.hmall.api.config;

import com.hmall.api.client.fallback.ItemClientFallback;
import com.hmall.common.utils.UserContext;
import feign.Logger;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Bean;

/**
 * Feign客户端默认配置类
 * 功能：配置Feign的日志级别、请求拦截器和熔断降级策略
 */
public class DefaultFeignConfig {

    /**
     * 配置Feign日志级别
     * @return 日志级别（FULL表示记录所有请求和响应的细节）
     * 作用：用于调试和排查Feign调用问题
     */
    @Bean
    public Logger.Level feignLogLevel() {
        return Logger.Level.FULL;
    }

    /**
     * 请求拦截器：传递用户上下文信息
     * @return 请求拦截器实例
     * 核心逻辑：
     * 1. 从ThreadLocal中获取当前用户ID（来自UserContext）
     * 2. 将用户ID添加到请求头中（键：user-info）
     * 3. 下游服务可从请求头中获取用户ID，实现身份传递
     */
    @Bean
    public RequestInterceptor userInfoRequestInterceptor() {
        return new RequestInterceptor() {
            @Override
            public void apply(RequestTemplate template) {

                // 1. 从UserContext获取当前线程的用户ID
                Long userId = UserContext.getUser();

                // 2. 若用户ID为空（未登录状态），直接跳过
                if (userId == null) {
                    return;
                }

                // 3. 将用户ID添加到请求头，传递给下游服务
                template.header("user-info", userId.toString());
            }
        };
    }

    /**
     * 配置熔断降级处理类
     * @return ItemClient的降级处理实现
     * 应用场景：当Item服务调用失败时，执行降级逻辑
     */
    @Bean
    public ItemClientFallback itemClientFallback() {
        return new ItemClientFallback();
    }
}